package com.zombieprogrammer.pantallas;

import com.badlogic.gdx.Gdx;
import com.badlogic.gdx.Input.Keys;
import com.badlogic.gdx.graphics.GL20;
import com.badlogic.gdx.graphics.OrthographicCamera;
import com.badlogic.gdx.math.Vector2;
import com.badlogic.gdx.physics.box2d.Body;
import com.badlogic.gdx.physics.box2d.BodyDef;
import com.badlogic.gdx.physics.box2d.BodyDef.BodyType;
import com.badlogic.gdx.physics.box2d.ChainShape;
import com.badlogic.gdx.physics.box2d.Fixture;
import com.badlogic.gdx.physics.box2d.FixtureDef;
import com.badlogic.gdx.physics.box2d.World;
import com.badlogic.gdx.scenes.scene2d.Stage;
import com.badlogic.gdx.utils.Array;
import com.badlogic.gdx.utils.viewport.FitViewport;
import com.zombieprogrammer.entradausuario.InputPrueba;
import com.zombieprogrammer.juego.Creador_Randmonster;
import com.zombieprogrammer.juego.Destructor;
import com.zombieprogrammer.juego.Estadio;
import com.zombieprogrammer.juego.Juego_Base;

public class Pantalla_Juego extends Pantalla {

	// CONSTANTES
	private static final int VELOCITYITERATIONS = 6;
	private static final float TIMESTEP = 1 / 60f;
	private static final int POSITIONINTERATIONS = 2;

	// VARIABLES
	// private Texture img;
	// Pantalla

	private OrthographicCamera camara_fisica;
	private OrthographicCamera camara_viewport;
	private int ancho = juego_base.ancho;
	private int alto = juego_base.alto;
	private float PPM = juego_base.PPM;
	private Creador_Randmonster dios;
	private World mundo_fisico;
	private Pantalla pantalla_seleccion;
	private Estadio estadio1;
	private Destructor destructor = juego_base.destructor;
	private InputPrueba inputprueba = new InputPrueba(this);

	// Constructor
	public Pantalla_Juego(Juego_Base jb) {
		super(jb);
	}

	// METODOS OVERIDE

	@Override
	public void show() {
		dios = juego_base.dios;
		camara_fisica = new OrthographicCamera(ancho / PPM, alto / PPM);
		camara_viewport = new OrthographicCamera(ancho / zoom, alto / zoom);
		mundo_fisico = juego_base.mundo_fisico;
		escenario = new Stage(new FitViewport(ancho, alto, camara_viewport));
		estadio1 = new Estadio(5, 5, 700, 1080, this);
		escenario.addActor(estadio1);
		dios.crear_randmonster(1, escenario, false);
		escenario.addListener(inputprueba);
		Gdx.input.setInputProcessor(escenario);
	}

	@Override
	public void render(float delta) {
		destructor.eliminar_cuerpos();
		camara_fisica.update();
		Gdx.gl.glClearColor(0.8f, 0.8f, 0.8f, 1);
		Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT);
		mundo_fisico.step(TIMESTEP, VELOCITYITERATIONS, POSITIONINTERATIONS);
		escenario.act();
		escenario.draw();

		juego_base.batch.begin();
		juego_base.fuente.draw(juego_base.batch,
				"FPS : " + Gdx.graphics.getFramesPerSecond(),
				juego_base.ancho - 100, juego_base.alto - 300);
		juego_base.batch.end();
		if (Gdx.input.isKeyPressed(Keys.F)) {
			render_fisicas();
		}
		if (Gdx.input.isKeyPressed(Keys.E)) {
			this.dispose();
			System.out.print(juego_base.getScreen().getClass().getName()
					+ "------->");
			juego_base.setPantalla_juego(new Pantalla_Seleccion(juego_base));
		}

		mov_camara(camara_viewport);

	}

	@Override
	public void resize(int width, int height) {
		escenario.getViewport().update((int) (width), (int) (height));
		camara_fisica.setToOrtho(false, ancho / PPM, alto / PPM);
	}

	@Override
	public void hide() {
		// TODO Auto-generated method stub

	}

	@Override
	public void pause() {
		// TODO Auto-generated method stub

	}

	@Override
	public void resume() {
		// TODO Auto-generated method stub

	}

	@Override
	public void dispose() {
		Array<Body> cuerpos_eliminar = new Array<Body>();
		mundo_fisico.getBodies(cuerpos_eliminar);
		for (Body b : cuerpos_eliminar) {
			mundo_fisico.destroyBody(b);
		}

	}

	// Metodos

	public void mov_camara(OrthographicCamera camara) {

		if (Gdx.input.isKeyPressed(Keys.UP)) {
			camara.translate(0, 4);
		} else if (Gdx.input.isKeyPressed(Keys.DOWN)) {
			camara.translate(0, -4);
		}
		if (Gdx.input.isKeyPressed(Keys.LEFT)) {
			camara.translate(-4, 0);
		} else if (Gdx.input.isKeyPressed(Keys.RIGHT)) {
			camara.translate(4, 0);
		}
		if (Gdx.input.isKeyPressed(Keys.A)) {
			camara.zoom += 0.01;
			// System.out.println("aca");
		}
		// if (Gdx.input.isTouched()){
		// camara.zoom -= 0.01;
		// System.out.println("aca");
		// }
		else if (Gdx.input.isKeyPressed(Keys.Z)) {
			camara.zoom -= 0.01;
		}

	}

	public void render_fisicas() {
		juego_base.render_fisicas.render(mundo_fisico, camara_fisica.combined);
	}

	public void crearestadio() {

		int alto1 = (int) ((alto / PPM) - 1);
		int ancho1 = (int) ((ancho / PPM) - 200 / PPM);
		// int alto1 = (int) ((720 / PPM) - 1);
		// int ancho1 = (int) ((1280 / PPM) - 250 / PPM);
		FixtureDef bolafix = new FixtureDef();
		// System.out.println(alto+"   "+ ancho);

		Vector2 v0 = new Vector2(1, 1);
		Vector2 v1 = new Vector2(ancho1, 1);
		Vector2 v2 = new Vector2(ancho1, alto1);
		Vector2 v3 = new Vector2(1, alto1);
		Vector2 v4 = new Vector2(1, alto1 + 2);
		Vector2 v5 = new Vector2(1, alto1 * 2);
		Vector2 v6 = new Vector2(ancho1, alto1 * 2);
		Vector2 v7 = new Vector2(ancho1, alto1 + 2);

		Vector2 vectores[] = { v0, v1, v2, v3, v0 };
		Vector2 vectores2[] = { v4, v5, v6, v7, v4 };

		BodyDef bodydef = new BodyDef();
		bodydef.type = BodyType.StaticBody;
		bodydef.position.set(0, 0);

		for (int i = 0; i <= 3; i += 1) {
			ChainShape estadio = new ChainShape();
			estadio.createChain(new Vector2[] { vectores[i], vectores[i + 1] });

			// definimos el fixture ;
			bolafix.friction = 0.0f;
			bolafix.restitution = 0f;
			bolafix.shape = estadio;

			// creamos el piso
			Body piso = mundo_fisico.createBody(bodydef);
			piso.createFixture(bolafix);
			piso.setUserData("WALL");
			Fixture fix = piso.createFixture(bolafix);
			fix.setUserData("pared");
		}

		for (int i = 0; i <= 3; i += 1) {
			ChainShape estadio2 = new ChainShape();
			estadio2.createChain(new Vector2[] { vectores2[i], vectores2[i + 1] });

			// definimos el fixture ;

			bolafix.friction = 0.0f;
			bolafix.restitution = 0f;
			bolafix.shape = estadio2;

			// creamos el piso
			Body piso = mundo_fisico.createBody(bodydef);
			piso = mundo_fisico.createBody(bodydef);
			piso.createFixture(bolafix);
			piso.setUserData("WALL");
			Fixture fix = piso.createFixture(bolafix);
			fix = piso.createFixture(bolafix);
			fix.setUserData("pared");
		}
	}
}
